package com.un.ebs.core.metadata;

import cn.hutool.core.util.ReflectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.TableId;
import com.un.ebs.core.util.WebResult;

import java.lang.reflect.Field;

/**
 * 标准服务的扩展
 *
 * @param <T> 输入参数类型
 * @param <R> 输出参数类型
 */
public interface ServiceFunctionExt<T, R extends WebResult> {

    /***
     * 将 DBService 的查询结果转换为指定的 Domain 类型。
     * @param obj DBService 查询结果
     * @param clazz 要转换的 Domain 类型
     * @param <F>
     * @return
     */
    default <F> F convert(Object obj, Class clazz) {
        F target = (F) ReflectUtil.newInstance(clazz);
        JSONObject json = (JSONObject)obj;

        for (Field f : ReflectUtil.getFields(clazz)) {
            DbField ann = f.getAnnotation(DbField.class);
            if (ann == null) {
                TableId annId = f.getAnnotation(TableId.class);
                if(annId==null){
                    continue;
                }else{
                    ReflectUtil.setFieldValue(target, f.getName(), json.get(annId.value()));
                }
                continue;
            }
            ReflectUtil.setFieldValue(target, f.getName(), json.get(ann.name()));
        }
        return target;
    }

    R exec(T arg);
}
